{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TMM for the TE And TM polarization only\n",
    "\n",
    "One thing which isn't super clear to me is the fact that in scattering matrices, if you consider off-normal incidence, the incoming ray has two ports, the reflected ray has two ports and likewise for the transmission side.\n",
    "\n",
    "The Maxwell's equations, typically formulated, is a 4x4 system of equations, but these don't actually correspond to the ports, do they\n",
    "\n",
    "### Significance of the transfer matrix\n",
    "The transfer matrix T is just a transfer function telling me how to map input amplitudes to output amplitudes. In dealing with homogeneous structures, the only inputs are plane waves and the only outputs are also plane waves.\n",
    "\n",
    "\\begin{equation}\n",
    "    \\begin{bmatrix}\n",
    "        T_{11} & T_{12}\\\\\n",
    "        T_{21} & T_{22}\n",
    "    \\end{bmatrix}\n",
    "\\end{equation}\n",
    "\n",
    "The transfer matrix, in effect, works the same as the scattering matrix (assuming the modes are sorted, which they trivially will be for the TE and TM case (since we only have a 2-by-2 matrix)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "sys.path.append('../')\n",
    "from TMM_functions import PQ_matrices as pq\n",
    "from TMM_functions import scatter_matrices as sm\n",
    "from TMM_functions import redheffer_star as rs\n",
    "from TMM_functions import generate_initial_conditions as ic\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from numpy.linalg import cond\n",
    "import cmath;\n",
    "from scipy import linalg as LA\n",
    "from numpy.linalg import solve as bslash\n",
    "import time\n",
    "from convolution_matrices.convmat1D import *\n",
    "# from RCWA_1D_functions.grating_fft.grating_conv import *\n",
    "\n",
    "def nonHermitianEigenSorter(eigenvalues):\n",
    "    N = len(eigenvalues);\n",
    "    sorted_indices=[];\n",
    "    sorted_eigs = [];\n",
    "    for i in range(N):\n",
    "        eig = eigenvalues[i];\n",
    "        if(np.real(eig)>0 and np.imag(eig) == 0):\n",
    "            sorted_indices.append(i); sorted_eigs.append(eig);\n",
    "        elif(np.real(eig)==0 and np.imag(eig) > 0):\n",
    "            sorted_indices.append(i); sorted_eigs.append(eig);\n",
    "        elif(np.real(eig)>0 and abs(np.imag(eig)) > 0):\n",
    "            sorted_indices.append(i); sorted_eigs.append(eig);\n",
    "    return sorted_eigs, sorted_indices;\n",
    "\n",
    "# Moharam et. al Formulation for stable and efficient implementation for RCWA\n",
    "plt.close(\"all\")\n",
    "'''\n",
    "'''\n",
    "L0 = 1e-6;\n",
    "e0 = 8.854e-12;\n",
    "mu0 = 4*np.pi*1e-8;\n",
    "c0 = 1/np.sqrt(e0*mu0)\n",
    "\n",
    "n_ridge = 3.48;              # ridge\n",
    "n_groove = 3.48;                # groove (unit-less)\n",
    "lattice_constant = 0.7;  # SI units\n",
    "\n",
    "## simulation parameters\n",
    "theta = (0)*np.pi/180;\n",
    "phi = (0)*np.pi/180;\n",
    "e_r = 1;\n",
    "m_r = 1;\n",
    "e_t = 1;\n",
    "m_t = 1;\n",
    "n_i = np.sqrt(e_r);\n",
    "\n",
    "normal_vector= [0,0,-1]\n",
    "\n",
    "# epsilon_tensor = np.array([[12,1,0],[0,2,0],[1,0,12]]);\n",
    "# epsilon_tensor = np.array([[12,10,0],[10,12,0],[0,0,2]]);\n",
    "# epsilon_tensor = np.array([[12,5,0],[5,12,0],[0,0,12]]);\n",
    "# epsilon_tensor = np.array([[12,1,0],[0,2,0],[1,0,12]]);\n",
    "\n",
    "epsilon_tensor = np.array([[12,0,10],[0,12,0],[10,0,12]]);\n",
    "## if the exy eyx term is equal to exx eyy, then there is a degeneracy which you have to account for.\n",
    "epsilon_tensor = np.array([[12,0,0],[0,12,5],[0,10,12]]);\n",
    "\n",
    "mu_tensor = np.array([[1,0,0],[0,1,0],[0,0,1]])\n",
    "I = np.matrix(np.eye(2))\n",
    "\n",
    "## specify the initial kx and ky\n",
    "k0=1\n",
    "kx = k0 *np.sin(theta)*np.cos(phi);\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "## =================== specify initial conditions ================== ##\n",
    "# c+ and c- are now one dimensional.\n",
    "cref = np.array([1,1]); #incident light"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0. -1.]\n",
      " [-1.  0.]]\n",
      "[[ 0.70710678  0.70710678]\n",
      " [-0.70710678  0.70710678]]\n"
     ]
    }
   ],
   "source": [
    "## vacuum\n",
    "a12 = -1;\n",
    "a21 = kx**2/1 -1\n",
    "A0 = np.matrix([[0, a12],\n",
    "                  [a21, 0]]);\n",
    "print(A0)\n",
    "lam0, W0 = np.linalg.eig(A0); #this is W\n",
    "print(W0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## DOING TMM for the TE and TM polarization using Scattering Matrices\n",
    "Now, we only have one transverse E and H component. The first thing to note is how are they related? (should be with a dz factor)\n",
    "\n",
    "### Important Questions to Answer\n",
    "Why do we need an eigenmode decomposition in the general case (especially since analytically, we don't need to do that)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-0.97466986+0.22364851j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.97466986-0.22364851j]]\n",
      "[[0.09198012+0.99576084j 0.        +0.j        ]\n",
      " [0.        +0.j         0.09198012-0.99576084j]]\n",
      "[[0.97602508+0.21765809j 0.        +0.j        ]\n",
      " [0.        +0.j         0.97602508-0.21765809j]]\n",
      "[[0.62712299-0.77892025j 0.        +0.j        ]\n",
      " [0.        +0.j         0.62712299+0.77892025j]]\n",
      "[[-0.30684896-0.95175822j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.30684896+0.95175822j]]\n",
      "[[-0.93138898-0.36402552j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.93138898+0.36402552j]]\n",
      "[[-0.91073385+0.41299378j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.91073385-0.41299378j]]\n",
      "[[-0.40981348+0.91216934j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.40981348-0.91216934j]]\n",
      "[[0.23310795+0.97245087j 0.        +0.j        ]\n",
      " [0.        +0.j         0.23310795-0.97245087j]]\n",
      "[[0.74194828+0.67045712j 0.        +0.j        ]\n",
      " [0.        +0.j         0.74194828-0.67045712j]]\n",
      "[[0.98314026+0.18285304j 0.        +0.j        ]\n",
      " [0.        +0.j         0.98314026-0.18285304j]]\n",
      "[[0.94821604-0.31762611j 0.        +0.j        ]\n",
      " [0.        +0.j         0.94821604+0.31762611j]]\n",
      "[[0.70274915-0.71143773j 0.        +0.j        ]\n",
      " [0.        +0.j         0.70274915+0.71143773j]]\n",
      "[[0.33861532-0.9409249j 0.        +0.j       ]\n",
      " [0.        +0.j        0.33861532+0.9409249j]]\n",
      "[[-0.05750374-0.99834529j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.05750374+0.99834529j]]\n",
      "[[-0.41946905-0.90776964j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.41946905+0.90776964j]]\n",
      "[[-0.70560894-0.70860146j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.70560894+0.70860146j]]\n",
      "[[-0.89623153-0.44358656j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.89623153+0.44358656j]]\n",
      "[[-0.9884577-0.1514971j  0.       +0.j       ]\n",
      " [ 0.       +0.j        -0.9884577+0.1514971j]]\n",
      "[[-0.99064733+0.13644734j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.99064733-0.13644734j]]\n",
      "[[-0.91755676+0.39760481j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.91755676-0.39760481j]]\n",
      "[[-0.78663643+0.61741649j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.78663643-0.61741649j]]\n",
      "[[-0.61547563+0.78815592j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.61547563-0.78815592j]]\n",
      "[[-0.42021862+0.9074229j  0.        +0.j       ]\n",
      " [ 0.        +0.j        -0.42021862-0.9074229j]]\n",
      "[[-0.21472138+0.97667534j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.21472138-0.97667534j]]\n",
      "[[-0.01022857+0.99994769j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.01022857-0.99994769j]]\n",
      "[[0.18461179+0.98281152j 0.        +0.j        ]\n",
      " [0.        +0.j         0.18461179-0.98281152j]]\n",
      "[[0.36353457+0.93158071j 0.        +0.j        ]\n",
      " [0.        +0.j         0.36353457-0.93158071j]]\n",
      "[[0.52234311+0.85273541j 0.        +0.j        ]\n",
      " [0.        +0.j         0.52234311-0.85273541j]]\n",
      "[[0.6585598+0.7525284j 0.       +0.j       ]\n",
      " [0.       +0.j        0.6585598-0.7525284j]]\n",
      "[[0.77108246+0.6367353j 0.        +0.j       ]\n",
      " [0.        +0.j        0.77108246-0.6367353j]]\n",
      "[[0.85986971+0.51051355j 0.        +0.j        ]\n",
      " [0.        +0.j         0.85986971-0.51051355j]]\n",
      "[[0.92566666+0.3783401j 0.        +0.j       ]\n",
      " [0.        +0.j        0.92566666-0.3783401j]]\n",
      "[[0.96977425+0.24400389j 0.        +0.j        ]\n",
      " [0.        +0.j         0.96977425-0.24400389j]]\n",
      "[[0.9938612+0.11063417j 0.       +0.j        ]\n",
      " [0.       +0.j         0.9938612-0.11063417j]]\n",
      "[[0.99981472-0.0192491j 0.        +0.j       ]\n",
      " [0.        +0.j        0.99981472+0.0192491j]]\n",
      "[[0.9896252-0.14367314j 0.       +0.j        ]\n",
      " [0.       +0.j         0.9896252+0.14367314j]]\n",
      "[[0.96529946-0.26114546j 0.        +0.j        ]\n",
      " [0.        +0.j         0.96529946+0.26114546j]]\n",
      "[[0.92879771-0.37058712j 0.        +0.j        ]\n",
      " [0.        +0.j         0.92879771+0.37058712j]]\n",
      "[[0.88198941-0.47126922j 0.        +0.j        ]\n",
      " [0.        +0.j         0.88198941+0.47126922j]]\n",
      "[[0.82662426-0.56275424j 0.        +0.j        ]\n",
      " [0.        +0.j         0.82662426+0.56275424j]]\n",
      "[[0.76431473-0.64484338j 0.        +0.j        ]\n",
      " [0.        +0.j         0.76431473+0.64484338j]]\n",
      "[[0.69652747-0.71753012j 0.        +0.j        ]\n",
      " [0.        +0.j         0.69652747+0.71753012j]]\n",
      "[[0.62458118-0.78095989j 0.        +0.j        ]\n",
      " [0.        +0.j         0.62458118+0.78095989j]]\n",
      "[[0.54964923-0.83539555j 0.        +0.j        ]\n",
      " [0.        +0.j         0.54964923+0.83539555j]]\n",
      "[[0.47276556-0.88118825j 0.        +0.j        ]\n",
      " [0.        +0.j         0.47276556+0.88118825j]]\n",
      "[[0.39483266-0.91875305j 0.        +0.j        ]\n",
      " [0.        +0.j         0.39483266+0.91875305j]]\n",
      "[[0.31663098-0.9485488j 0.        +0.j       ]\n",
      " [0.        +0.j        0.31663098+0.9485488j]]\n",
      "[[0.23882886-0.97106168j 0.        +0.j        ]\n",
      " [0.        +0.j         0.23882886+0.97106168j]]\n",
      "[[0.16199277-0.98679194j 0.        +0.j        ]\n",
      " [0.        +0.j         0.16199277+0.98679194j]]\n",
      "[[0.0865974-0.99624339j 0.       +0.j        ]\n",
      " [0.       +0.j         0.0865974+0.99624339j]]\n",
      "[[0.01303531-0.99991504j 0.        +0.j        ]\n",
      " [0.        +0.j         0.01303531+0.99991504j]]\n",
      "[[-0.05837382-0.99829479j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.05837382+0.99829479j]]\n",
      "[[-0.12737468-0.99185467j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.12737468+0.99185467j]]\n",
      "[[-0.19376838-0.9810473j  0.        +0.j       ]\n",
      " [ 0.        +0.j        -0.19376838+0.9810473j]]\n",
      "[[-0.25740524-0.96630355j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.25740524+0.96630355j]]\n",
      "[[-0.31817822-0.94803092j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.31817822+0.94803092j]]\n",
      "[[-0.37601703-0.92661275j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.37601703+0.92661275j]]\n",
      "[[-0.43088285-0.90240787j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.43088285+0.90240787j]]\n",
      "[[-0.48276358-0.87575072j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.48276358+0.87575072j]]\n",
      "[[-0.53166971-0.84695178j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.53166971+0.84695178j]]\n",
      "[[-0.57763063-0.81629827j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.57763063+0.81629827j]]\n",
      "[[-0.62069136-0.784055j  0.        +0.j      ]\n",
      " [ 0.        +0.j       -0.62069136+0.784055j]]\n",
      "[[-0.66090976-0.75046538j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.66090976+0.75046538j]]\n",
      "[[-0.69835405-0.71575249j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.69835405+0.71575249j]]\n",
      "[[-0.73310063-0.68012018j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.73310063+0.68012018j]]\n",
      "[[-0.76523229-0.64375425j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.76523229+0.64375425j]]\n",
      "[[-0.79483656-0.60682357j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.79483656+0.60682357j]]\n",
      "[[-0.82200437-0.56948118j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.82200437+0.56948118j]]\n",
      "[[-0.84682887-0.53186546j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.84682887+0.53186546j]]\n",
      "[[-0.86940444-0.49410113j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.86940444+0.49410113j]]\n",
      "[[-0.88982586-0.45630026j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.88982586+0.45630026j]]\n",
      "[[-0.90818762-0.41856331j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.90818762+0.41856331j]]\n",
      "[[-0.9245833-0.38097995j  0.       +0.j        ]\n",
      " [ 0.       +0.j         -0.9245833+0.38097995j]]\n",
      "[[-0.93910512-0.34362998j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.93910512+0.34362998j]]\n",
      "[[-0.95184356-0.30658416j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.95184356+0.30658416j]]\n",
      "[[-0.96288698-0.2699049j  0.        +0.j       ]\n",
      " [ 0.        +0.j        -0.96288698+0.2699049j]]\n",
      "[[-0.97232148-0.23364703j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.97232148+0.23364703j]]\n",
      "[[-0.9802306-0.19785844j  0.       +0.j        ]\n",
      " [ 0.       +0.j         -0.9802306+0.19785844j]]\n",
      "[[-0.98669525-0.16258068j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.98669525+0.16258068j]]\n",
      "[[-0.99179357-0.12784955j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.99179357+0.12784955j]]\n",
      "[[-0.99560089-0.0936956j  0.        +0.j       ]\n",
      " [ 0.        +0.j        -0.99560089+0.0936956j]]\n",
      "[[-0.99818967-0.06014464j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.99818967+0.06014464j]]\n",
      "[[-0.99962952-0.02721817j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.99962952+0.02721817j]]\n",
      "[[-0.99998717+0.00506622j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.99998717-0.00506622j]]\n",
      "[[-0.99932653+0.03669444j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.99932653-0.03669444j]]\n",
      "[[-0.99770874+0.06765556j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.99770874-0.06765556j]]\n",
      "[[-0.99519217+0.09794154j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.99519217-0.09794154j]]\n",
      "[[-0.99183254+0.12754687j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.99183254-0.12754687j]]\n",
      "[[-0.98768298+0.15646833j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.98768298-0.15646833j]]\n",
      "[[-0.98279405+0.18470478j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.98279405-0.18470478j]]\n",
      "[[-0.9772139+0.21225689j  0.       +0.j        ]\n",
      " [ 0.       +0.j         -0.9772139-0.21225689j]]\n",
      "[[-0.97098831+0.23912695j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.97098831-0.23912695j]]\n",
      "[[-0.96416077+0.26531871j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.96416077-0.26531871j]]\n",
      "[[-0.95677257+0.29083716j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.95677257-0.29083716j]]\n",
      "[[-0.9488629+0.31568845j  0.       +0.j        ]\n",
      " [ 0.       +0.j         -0.9488629-0.31568845j]]\n",
      "[[-0.94046893+0.33987969j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.94046893-0.33987969j]]\n",
      "[[-0.93162587+0.36341882j  0.        +0.j        ]\n",
      " [ 0.        +0.j         -0.93162587-0.36341882j]]\n",
      "[[-0.9223671+0.38631456j  0.       +0.j        ]\n",
      " [ 0.       +0.j         -0.9223671-0.38631456j]]\n",
      "[[-0.9127242+0.40857623j  0.       +0.j        ]\n",
      " [ 0.       +0.j         -0.9127242-0.40857623j]]\n"
     ]
    }
   ],
   "source": [
    "ref = [];\n",
    "trans = []\n",
    "wvlen_scan = np.linspace(0.5, 4, 100);\n",
    "thickness = 0.5; # 1 layer\n",
    "E0 = 1;\n",
    "for wvlen in wvlen_scan:\n",
    "    k0 = 2*np.pi/wvlen;\n",
    "    omega = c0*k0;\n",
    "    kx = np.sin(theta)*np.cos(phi);\n",
    "    # we will build the system by rows?\n",
    "    a11 = -1j*(kx*(epsilon_tensor[2,0]/epsilon_tensor[2,2]))\n",
    "    a12 = -epsilon_tensor[0,0] + epsilon_tensor[0,2]*epsilon_tensor[2,0]/epsilon_tensor[2,2]\n",
    "    a21 = kx**2/epsilon_tensor[2,2] -1\n",
    "    a22 = 1j*kx*epsilon_tensor[2,0]/epsilon_tensor[2,2];\n",
    "    \n",
    "    A = np.matrix([[a11, a12],\n",
    "                  [a21, a22]]);\n",
    "    #print(np.linalg.cond(A))\n",
    "    eigenvals, eigenmodes = np.linalg.eig(A); #this is W\n",
    "    rounded_eigenvals = np.round(eigenvals, 3)    \n",
    "    propagation_phase = np.diag(np.exp(1j*eigenvals*k0*thickness)); #we shouldn't have to scale by 1j...theoretically\n",
    "    print(propagation_phase); #one is huge, and one is small....\n",
    "    #print(propagation_phase.shape)\n",
    "#     plt.plot(np.real(rounded_eigenvals), np.imag(rounded_eigenvals), 'o')\n",
    "#     plt.show()\n",
    "    \n",
    "    ## need Wref and Wtran\n",
    "    kz0 = np.sqrt(omega**2-kx**2)\n",
    "    \n",
    "    W1 = eigenmodes;\n",
    "    ## compute transfer matrix;\n",
    "    T = np.linalg.inv(W0)@W1@propagation_phase;\n",
    "    ## process the coefficients\n",
    "    #print(T)\n",
    "    ## convert ctran into a transmission\n",
    "    # what about reflection? (typically, we derived these from the scattering matrix)\n",
    "    Er = T[0,0]*E0\n",
    "    Et = T[0,1]*E0; #only one out of plane component so we don't need to recover any additional components\n",
    "    \n",
    "    r = np.linalg.norm(Er);\n",
    "    t = np.linalg.norm(Et);\n",
    "    ref.append(r);\n",
    "    trans.append(t);\n",
    "\n",
    "    \n",
    "ref = np.array(ref);\n",
    "trans = np.array(trans);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x23514dd65c0>]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure();\n",
    "plt.plot(ref);\n",
    "plt.plot(trans)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.97466986+0.22364851j,  0.        +0.j        ],\n",
       "       [ 0.        +0.j        , -0.97466986-0.22364851j]])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "propagation_phase"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 3.46410162-0.j -3.46410162+0.j]\n"
     ]
    }
   ],
   "source": [
    "print(eigenvals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'T' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-8-7d0fa1f84bbd>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mT\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m: name 'T' is not defined"
     ]
    }
   ],
   "source": [
    "print(T)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Check with Analytic Form\n",
    "\n",
    "The analytic form of TMM appears to be analytic and stable (for TE and TM, but why is that?)\n",
    "This analytic form is also derived very simply by matching coefficients it appears. There is no matrix inversion or analysis of modes or anything in the analytic forms..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "er = 12;\n",
    "mur = 1;\n",
    "\n",
    "def transfer_matrix(k,L, er, mu): ## this is the TE polarization\n",
    "    Zc = 1/k; #np.sqrt(mu/er);\n",
    "    M = np.array([[np.cos(k*L), 1*Zc*np.sin(k*L)],\\\n",
    "                  [(-1/Zc)*np.sin(k*L), np.cos(k*L)]], dtype = 'complex')\n",
    "    return M;\n",
    "\n",
    "def RT(M, kL, kR):\n",
    "    '''\n",
    "    kL: k of incident\n",
    "    kR: k of transmission medium\n",
    "    '''\n",
    "    denominator = (-M[1,0]+kL*kR*M[0,1])+1j*(kL*M[1,1]+kR*M[0,0])\n",
    "    r = ((M[1,0]+ kL*kR*M[0,1]) + 1j*(kL*M[1,1] - kR*M[0,0]))/denominator;\n",
    "    \n",
    "    t = 2j*kL*np.exp(-1j*kR*L)/denominator;\n",
    "    return r,t;\n",
    "\n",
    "\n",
    "L = 0.5; #layer thickness\n",
    "wvlen_scan = np.linspace(0.5, 2, 301)\n",
    "spectra = [];\n",
    "for wvlen in wvlen_scan:\n",
    "    k = 2*np.pi/wvlen;\n",
    "    #in the medium\n",
    "    kprime = np.sqrt(er)*k;\n",
    "    M1 = transfer_matrix(kprime,L, er, mur)\n",
    "    M2 = transfer_matrix(2*k, L, 4, 1);\n",
    "    M = M1@M2;\n",
    "    #assume a structure with air for reflection and transmission methods\n",
    "    r, t = RT(M, k, k)\n",
    "   \n",
    "    R = abs(r)**2; T = abs(t)**2;\n",
    "    spectra.append([R,T])\n",
    "spectra = np.array(spectra)\n",
    "\n",
    "plt.plot(wvlen_scan, spectra)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Check with the Impedance Transformation\n",
    "FROM EE236, the impedance transform starts at the transmission layer and then moves back up to the reflection region"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "def impedanceTransformer(Z_0, Z0, kz, z):\n",
    "    return Z_0 * (Z0 - 1j*Z_0*np.tan(kz*z))/(Z_0 - 1j*Z0*np.tan(kz*z));\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "## single layer\n",
    "Z_0 = np.sqrt(mur/er);\n",
    "Z0 = 1;\n",
    "\n",
    "spectra = [];\n",
    "L= 0.5;\n",
    "for wvlen in wvlen_scan:\n",
    "    kz = 2*np.pi/wvlen;\n",
    "    Gamma_ref = (impedanceTransformer(Z_0, Z0, kz, L) - Z0)/(impedanceTransformer(Z_0, Z0, kz, L) + Z0);\n",
    "    spectra.append(abs(Gamma_ref)**2);\n",
    "\n",
    "spectra = np.array(spectra);\n",
    "plt.plot(wvlen_scan, spectra);\n",
    "plt.plot(wvlen_scan, 1-spectra);\n",
    "plt.show();"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
